package org.example.aggregation.component;

import org.example.aggregation.dto.AggregationDto;

import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class AggregationList<N, T extends AggregationDto<N,T>>{

    //这个 list，用来做首个 list
    private final List<T> primaryList;

    public AggregationList(List<T> list) {
        if(list == null){
            primaryList = new ArrayList<>();
        }else{
            primaryList = list;
        }
    }

    @SafeVarargs
    public final Collection<T> aggregation(List<T>... lists){
        if(lists == null){
            return primaryList;
        }

        //通过主 list 来对应其他后面 list
        //提供 linkedHashMap 用来保证输出顺序
        Map<N,T> primaryMap = this.primaryList.stream()
                //过滤掉可能的空元素
                .filter(Objects::nonNull)
                .collect(
                    Collectors.toMap(
                        AggregationDto::uniqueKey,
                        e -> e,
                        //第一个 list，出现重复 key 的时候，累计其参数
                        AggregationDto::concat,
                        (Supplier<Map<N, T>>) LinkedHashMap::new
                    ));

        for(List<T> listItem : lists){
            //空的 list 直接过
            if(listItem == null || listItem.isEmpty()){
                continue;
            }

            for(T t : listItem) {
                if(t == null){
                    continue;
                }
                primaryMap.merge(t.uniqueKey(), t, (t1, t2) -> {
                    t1.concat(t2);
                    return t1;
                });
            }
        }
        return primaryMap.values();
    }

}
